package cloud.seri.iot.manager.client

import cloud.seri.iot.common.model.DeviceDTO
import cloud.seri.iot.common.model.QueryDeviceDTO
import cloud.seri.iot.common.model.RegisterDevice
import com.aliyuncs.iot.model.v20180120.*
import org.springframework.web.bind.annotation.*

@AuthorizedFeignClient("seri-iot-aliyun")
interface DeviceManagerClient
{
    companion object
    {
        const val BASE_URL: String = "/api/devices"
    }

    /**
     * 注册设备
     *
     * @param pk         产品名称  必须
     * @param DeviceName            设备命名  非必须
     * @return 产品创建信息
     */
    @PostMapping("$BASE_URL/register")
    fun registerDevice(@RequestBody dto: RegisterDevice): RegisterDeviceResponse?

    /**
     * 删除设备。
     *
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @param IotId            设备ID    非必须
     * @return 产品创建信息
     */
    @DeleteMapping(BASE_URL)
    fun deleteDevice(@RequestParam IotId: String?): DeleteDeviceResponse

    /**
     * 查询指定设备的详细信息
     *
     * @param IotId                 设备ID  非必须
     * @param pk            设备所隶属的产品Key。  非必须
     * @param DeviceName            设备名  非必须
     * @return 产品创建信息
     */
    @GetMapping("$BASE_URL/detail")
    fun queryDeviceDetail(@RequestParam IotId: String?): QueryDeviceDetailResponse?

    /**
     * 查询指定产品下的所有设备列表。
     *
     * @param pk         产品名称  必须
     * @param PageSize            设备命名  非必须
     * @param CurrentPage            设备命名  非必须
     * @return 产品创建信息
     */
    @GetMapping(BASE_URL)
    fun queryDevice(@RequestParam pk: String, @RequestParam pageSize: Int? = 10, @RequestParam currentPage: Int? = 1): QueryDeviceResponse

    /**
     * 批量注册多个设备
     *
     * @param pk       产品名称  必须
     * @param Count       设备的数量 必须
     *
     * @Des 描述：
     */
    @PostMapping("$BASE_URL/batch-register")
    fun batchRegisterDevice(@RequestParam pk: String, @RequestParam count: Int?): BatchRegisterDeviceResponse?

    /**
     * 在指定产品下批量自定义设备名称
     *
     * @param pk       产品名称  非必须
     * @param DeviceNames       设备的名称  非必须
     * 描述：
     * 该接口需要和BatchRegisterDeviceWithApplyId接口结合使用，实现在一个产品下批量注册（即新建）
     * 多个设备，并且为每个设备单独命名。单次调用，最多能传入1,000 个设备名称。
     */
    @PostMapping("$BASE_URL/batch-check-device-names")
    fun batchCheckDeviceNames(@RequestParam pk: String, @RequestBody DeviceNames: List<String>): BatchCheckDeviceNamesResponse?

    /**
     * 根据申请批次ID（ApplyId）批量注册设备
     *
     * @param pk       产品名称  必须
     * @param ApplyId       要批量注册的设备的申请批次ID。申请批次ID由调用BatchCheckDeviceNames接口返回。  必须
     *
     * @Des 描述：
     * 该接口需要和BatchCheckDeviceNames接口结合使用，实现在一个产品下批量注册（即新建）多个设备，并且为每个设备单独命名。
     */
    @GetMapping("$BASE_URL/batch-register-device-with-applyId")
    fun batchRegisterDeviceWithApplyId(@RequestParam pk: String, @RequestParam ApplyId: Long?): BatchRegisterDeviceWithApplyIdResponse?

    /**
     * 查询批量注册设备申请的处理状态和结果
     *
     * @param pk       产品名称  必须
     * @param ApplyId       设备的数量 必须
     *
     * @Des 描述：
     */
    @GetMapping("$BASE_URL/query-batch-register-device-status")
    fun queryBatchRegisterDeviceStatus(@RequestParam pk: String, @RequestParam ApplyId: Long?): QueryBatchRegisterDeviceStatusResponse?

    /**
     * 查询批量注册的设备信息
     *
     * @param ApplyId       产品名称  必须
     * @param PageSize         必须
     * @param CurrentPage             必须
     *
     * @Des 描述：
     */
    @GetMapping("$BASE_URL/query-page-applyId")
    fun queryPageByApplyId(@RequestParam ApplyId: Long?, @RequestParam PageSize: Int?, @RequestParam CurrentPage: Int?): QueryPageByApplyIdResponse?

    /**
     * 查询指定产品下的设备统计数据
     *
     * @param pk 设备所隶属的产品Key
     *
     * @Des 描述：
     */
    @GetMapping("$BASE_URL/query-device-statistics")
    fun queryDeviceStatistics(pk: String): QueryDeviceStatisticsResponse?

    /**
     * 查看指定设备的运行状态
     *
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @param IotId            设备ID    非必须
     * @return 产品创建信息
     */
    @GetMapping("$BASE_URL/device-status")
    fun getDeviceStatus(@RequestParam pk: String, @RequestParam DeviceName: String?, @RequestParam IotId: String?): GetDeviceStatusResponse?

    /**
     * 批量查看指定设备的运行状态
     *
     * @param pk       产品名称  非必须
     * @param DeviceNames       设备的名称  非必须
     * @return 产品创建信息
     */
    @GetMapping("$BASE_URL/batch-device-state")
    fun batchGetDeviceState(@RequestParam pk: String, @RequestParam DeviceNames: List<String>): BatchGetDeviceStateResponse?

    /**
     * 禁用指定设备
     *
     * @param IotId       设备的名称  非必须
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @return 产品创建信息
     */
    @PostMapping("$BASE_URL/disable")
    fun disableThing(dto: DeviceDTO): DisableThingResponse?

    /**
     * 启用指定设备
     *
     * @param IotId       设备的名称  非必须
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @return 产品创建信息
     */
    @PostMapping("$BASE_URL/enable")
    fun enableThing(dto: DeviceDTO): EnableThingResponse?
}
